package exportacao;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class LerXMLSMP6 {
	
	@SuppressWarnings({ "finally", "static-access" })
	public List<BeanLerXMLSMP6> listaValores(String file, String no) {
				
		List<BeanLerXMLSMP6> lista = new ArrayList<BeanLerXMLSMP6>();
		
		try {
			DocumentBuilderFactory dbFactory = DocumentBuilderFactory
					.newInstance();

			DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();

			File fXmlFile = new File(file);

			Document doc = dBuilder.parse(fXmlFile);
			doc.getDocumentElement().normalize();

			Element elemento = (Element) doc.getDocumentElement();

			NodeList smp = ((Element) elemento.getElementsByTagName(no)
					.item(0)).getElementsByTagName("Unidade_Consolidacao");

			for (int i = 0; i < smp.getLength(); i++) {
				BeanLerXMLSMP6 beanLerXMLSMP6 = new BeanLerXMLSMP6();
				Node n = smp.item(i);
				if (n.getNodeType() == n.ELEMENT_NODE) {
					Element eElement = (Element) n;										
					beanLerXMLSMP6.setUnidadeConsolidacao(eElement.getAttribute("Codigo").toString());
					verificaUnidadePrimaria(eElement, beanLerXMLSMP6, lista);					
				}
			}					
						
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			return lista.isEmpty()? null:lista;
		}
	}
	
	/**
	 * Método que verifica a unidade primária do XML
	 * @param eElement
	 * 			passa o elemento da unidade de consolidação como parametro.
	 */
	public void verificaUnidadePrimaria(Element eElement, BeanLerXMLSMP6 beanLerXMLSMP6, List<BeanLerXMLSMP6> lista) {
		NodeList ele = eElement.getElementsByTagName("Unidade");
		List<String> unidadesPrimarias = new ArrayList<String>();
		for (int i = 0; i < ele.getLength(); i++) {
			Node p = ele.item(i);
			Element eEle = (Element) p;
			unidadesPrimarias.add(eEle.getAttribute("Primaria").toString());
		}
		beanLerXMLSMP6.setUnidadePrimaria(unidadesPrimarias);
		verificaPeriodo(eElement, beanLerXMLSMP6, lista);
	}
	
	/**
	 * Metodo que verifica o periodo do XML.
	 * @param eElement
	 * 			passa o elemento unidade primaria como parametro.
	 */
	public void verificaPeriodo(Element eElement, BeanLerXMLSMP6 beanLerXMLSMP6, List<BeanLerXMLSMP6> lista) {
		NodeList per = eElement.getElementsByTagName("Periodo");
		List<String> periodos = new ArrayList<String>();				
		for (int m = 0; m < per.getLength(); m++) {
			Node p = per.item(m);
			Element ePer = (Element) p;			
			periodos.add(ePer.getAttribute("Coleta").toString());			
		}		
		beanLerXMLSMP6.setPeriodos(periodos);		
		verificaFatorPonderacaoEValores(eElement, beanLerXMLSMP6, lista);
	}
	
	/**
	 * Metodo que verifica os valores do fator de ponderacao.
	 * @param eElement
	 * 			passa o elemento do codigo de unidade primaria como parametro.
	 * @param eElement
	 * 			passa o elemento do periodo como parametro
	 */
	public void verificaFatorPonderacaoEValores(Element eElement, BeanLerXMLSMP6 beanLerXMLSMP6, List<BeanLerXMLSMP6> lista){
		List<String> ponderacao = new ArrayList<String>();
		List<String> valores = new ArrayList<String>();
		
		NodeList fat = eElement.getElementsByTagName("Fator");
		for (int i = 0; i < fat.getLength(); i++) {
			Node f = fat.item(i);
			Element eFat = (Element) f;
			ponderacao.add(eFat.getAttribute("valor").toString());
		}
		beanLerXMLSMP6.setPonderacao(ponderacao);
		
		NodeList cont = eElement.getElementsByTagName("Conteudo");
		for (int l = 0; l < cont.getLength(); l++) {
			Node c = cont.item(l);
			Element eCont = (Element) c;
			valores.add(eCont.getAttribute("valor").toString());
		}
		beanLerXMLSMP6.setValores(valores);
		
		lista.add(beanLerXMLSMP6);
	}
	
	public List<BeanLerXMLSMP6> testaComparacaoXMLVisent(List<BeanLerXMLSMP6> listaCliente, List<BeanLerXMLSMP6> listaVisent){
		List<BeanLerXMLSMP6> listaErros = new ArrayList<BeanLerXMLSMP6>();
		boolean excUniPrimaria = false;
		boolean excPonderacao = false;
		boolean excValores = false;
		for (BeanLerXMLSMP6 beanVisent : listaVisent) {
			int index = 0;
			for (BeanLerXMLSMP6 beanCliente : listaCliente) {
				if(Integer.parseInt(beanVisent.getUnidadeConsolidacao()) !=
						Integer.parseInt(beanCliente.getUnidadeConsolidacao())){
					index++;
				}else{
					boolean flag = false;
					for (int i = 0; i < beanVisent.getUnidadePrimaria().size(); i++) {
						if(beanVisent.getUnidadePrimaria().size() == beanCliente.getUnidadePrimaria().size()){
							if(Integer.parseInt(beanVisent.getUnidadePrimaria().get(i)) !=
									Integer.parseInt(beanCliente.getUnidadePrimaria().get(i))){
								flag = true;
							}
						}else{
							excUniPrimaria = true;
							flag = true;
						}
					}
					if(flag){
						index++;
					}else{
						boolean flag1 = false;
						for (int i = 0; i < beanVisent.getPonderacao().size(); i++) {
							if(beanVisent.getPonderacao().size() == beanCliente.getPonderacao().size()){
								if(Integer.parseInt(beanVisent.getPonderacao().get(i)) !=
										Integer.parseInt(beanCliente.getPonderacao().get(i))){
									flag1 = true;
								}
							}else{
								excPonderacao = true;
								flag1 = true;
							}
						}
						if(flag1){
							index++;
						}else{
							boolean flag2 = false;
							for (int i = 0; i < beanVisent.getValores().size(); i++) {
								if(beanVisent.getValores().size() == beanCliente.getValores().size()){
									if(Integer.parseInt(beanVisent.getValores().get(i)) != 
											Integer.parseInt(beanCliente.getValores().get(i))){
										flag2 = true;
									}
								}else{
									excValores = true;
									flag2 = true;
								}
							}
							if(flag2){
								index++;
							}
						}
					}
				}
			}	
			if(index == listaCliente.size()){
				listaErros.add(beanVisent);				
			}
		}
		System.out.println("Exceptions - "+excUniPrimaria+"\t"+excPonderacao+"\t"+excValores);
		return listaErros;
	}
	
	public List<BeanLerXMLSMP6> testaComparacaoXMLCliente(List<BeanLerXMLSMP6> listaCliente, List<BeanLerXMLSMP6> listaVisent){
		List<BeanLerXMLSMP6> listaErros = new ArrayList<BeanLerXMLSMP6>();
		boolean excUniPrimaria = false;
		boolean visentMaiorUP = false;
		boolean clienteMaiorUP = false;
		boolean excPonderacao = false;
		boolean excValores = false;		
		int diferencaUP = 0;
		int diferencaPond = 0;
		int diferencaVal = 0;
		for (BeanLerXMLSMP6 beanCliente : listaCliente) {
			int index = 0;
			for (BeanLerXMLSMP6 beanVisent : listaVisent) {
				if(Integer.parseInt(beanVisent.getUnidadeConsolidacao()) !=
						Integer.parseInt(beanCliente.getUnidadeConsolidacao())){
					index++;
				}else{
					boolean flag = false;
					for (int i = 0; i < beanVisent.getUnidadePrimaria().size(); i++) {
						if(beanVisent.getUnidadePrimaria().size() == beanCliente.getUnidadePrimaria().size()){
							if(Integer.parseInt(beanVisent.getUnidadePrimaria().get(i)) !=
									Integer.parseInt(beanCliente.getUnidadePrimaria().get(i))){
								flag = true;
							}
						}else{
							excUniPrimaria = true;
							if(beanVisent.getUnidadePrimaria().size() > beanCliente.getUnidadePrimaria().size()){
								diferencaUP = beanVisent.getUnidadePrimaria().size() - beanCliente.getUnidadePrimaria().size();
								visentMaiorUP = true;
							}else{
								diferencaUP = beanCliente.getUnidadePrimaria().size() - beanVisent.getUnidadePrimaria().size();
								clienteMaiorUP = true;
							}
							flag = true;
						}
					}
					if(flag){
						index++;
					}else{
						boolean flag1 = false;
						for (int i = 0; i < beanVisent.getPonderacao().size(); i++) {
							if(beanVisent.getPonderacao().size() == beanVisent.getPonderacao().size()){
								if(Integer.parseInt(beanVisent.getPonderacao().get(i)) !=
										Integer.parseInt(beanCliente.getPonderacao().get(i))){
									flag1 = true;
								}
							}else{
								excPonderacao = true;
								if(beanVisent.getPonderacao().size() > beanCliente.getPonderacao().size()){
									diferencaPond = beanVisent.getPonderacao().size() - beanCliente.getPonderacao().size();
								}else{
									diferencaPond = beanCliente.getPonderacao().size() - beanVisent.getPonderacao().size();
								}
								flag1 = true;
							}
						}
						if(flag1){
							index++;
						}else{
							boolean flag2 = false;
							for (int i = 0; i < beanVisent.getValores().size(); i++) {
								if(beanVisent.getValores().size() == beanCliente.getValores().size()){
									if(Integer.parseInt(beanVisent.getValores().get(i)) != 
											Integer.parseInt(beanCliente.getValores().get(i))){
										flag2 = true;
									}
								}else{
									excValores = true;
									if(beanVisent.getUnidadePrimaria().size() > beanCliente.getUnidadePrimaria().size()){
										diferencaVal = beanVisent.getValores().size() - beanCliente.getValores().size();
									}else{
										diferencaVal = beanCliente.getValores().size() - beanVisent.getValores().size();
									}
									flag2 = true;
								}
							}
							if(flag2){
								index++;
							}
						}
					}
				}
			}	
			if(index == listaVisent.size()){
				listaErros.add(beanCliente);				
			}
		}
		System.out.println("Exceptions - "+excUniPrimaria+"\t"+excPonderacao+"\t"+excValores);
		System.out.println("Diferença UniPrimaria - "+diferencaUP+"\n"				
				+"Diferença Ponderação - "+diferencaPond+"\n"
				+"Diferença Valores - "+diferencaVal);
		if(visentMaiorUP){
			System.out.println("XML Visent tem mais unidades primárias!");
		}else if(clienteMaiorUP){
			System.out.println("XML Cliente tem mais unidades primárias!");
		}
		return listaErros;
	}
	
	public void descobreUnidadesPrimariasAMais(List<BeanLerXMLSMP6> listaCliente, List<BeanLerXMLSMP6> listaVisent){
		System.out.println("TEM NO XML VISENT E NÃO TEM NO XML CLARO\n");
		for (int i = 0; i < listaVisent.size(); i++) {
			List<String> unidadesPrimariasVisent = new ArrayList<String>();
			List<String> unidadesPrimariasCliente = new ArrayList<String>();
			List<String> upAMaisVisent = new ArrayList<String>();
			unidadesPrimariasVisent.addAll(listaVisent.get(i).getUnidadePrimaria());
			unidadesPrimariasCliente.addAll(listaCliente.get(i).getUnidadePrimaria());
			for (String string : unidadesPrimariasVisent) {
				boolean flag = false;
				for (String string2 : unidadesPrimariasCliente) {
					if(Integer.parseInt(string) == Integer.parseInt(string2)){
						flag = true;
					}
				}
				if(!flag){
					upAMaisVisent.add(string);
				}
			}	
//			System.out.println(listaVisent.get(i).getUnidadeConsolidacao()+" - "+listaCliente.get(i).getUnidadeConsolidacao());
//			System.out.println(unidadesPrimariasVisent.size()+" - "+unidadesPrimariasVisent.toString());
//			System.out.println(unidadesPrimariasCliente.size()+" - "+unidadesPrimariasCliente.toString());
			System.out.println(upAMaisVisent.size()+" - "+upAMaisVisent.toString());
			System.out.println("\n\n");
		}		
	}
	
	public void descobreUnidadesPrimariasAMaisCliente(List<BeanLerXMLSMP6> listaCliente, List<BeanLerXMLSMP6> listaVisent){
		System.out.println("TEM NO XML CLARO E NÃO TEM NO XML VISENT\n");
		for (int i = 0; i < listaVisent.size(); i++) {
			List<String> unidadesPrimariasVisent = new ArrayList<String>();
			List<String> unidadesPrimariasCliente = new ArrayList<String>();
			List<String> upAMaisVisent = new ArrayList<String>();
			unidadesPrimariasVisent.addAll(listaVisent.get(i).getUnidadePrimaria());
			unidadesPrimariasCliente.addAll(listaCliente.get(i).getUnidadePrimaria());
			for (String string : unidadesPrimariasCliente) {
				boolean flag = false;
				for (String string2 : unidadesPrimariasVisent) {
					if(Integer.parseInt(string) == Integer.parseInt(string2)){
						flag = true;
					}
				}
				if(!flag){
					upAMaisVisent.add(string);
				}
			}	
//			System.out.println(listaVisent.get(i).getUnidadeConsolidacao()+" - "+listaCliente.get(i).getUnidadeConsolidacao());
//			System.out.println(unidadesPrimariasVisent.size()+" - "+unidadesPrimariasVisent.toString());
//			System.out.println(unidadesPrimariasCliente.size()+" - "+unidadesPrimariasCliente.toString());
			System.out.println(upAMaisVisent.size()+" - "+upAMaisVisent.toString());
			System.out.println("\n\n");
		}		
	}
	
}
